package personal.leil.learning.utils;

/**
 * 提供一些操作数组的基础工具类
 * <p>
 * generateRandomArr - 生成0~1000中随机数组成的数组
 * printArr - 将一个整型数组以字符串的形式打印出来
 * </p>
 *
 * @author Leil
 * @version 1.0
 * @since 2023-12-29
 */
public class ArrayUtils {


    /**
     * 生成一个0~1000中随机整数组成的数组
     *
     * @param length 数组的长度
     * @return 生成的数组对象
     */
    public static int[] generateRandomArr(int length) {
        int[] arr = new int[length];
        for (int i = 0; i < length; i++) {
            arr[i] = (int) (Math.random() * 1000);
        }
        return arr;
    }

    /**
     * 将数组以字符串的形式打印
     *
     * @param arr 要打印的数组
     */
    public static void printArr(int[] arr) {
        String arrStr = "[";
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                arrStr += arr[i] + ", ";
            } else {
                arrStr += arr[i];
            }
        }
        arrStr += "]";
        System.out.println(arrStr);
    }

    /**
     * 交换数组中不同位置的两个数
     *
     * @param arr 源数组
     * @param i   位置1
     * @param j   位置2
     */
    public static void swap(int[] arr, int i, int j) {
        if (i == j)
            return;
        if (i < 0 || j < 0 || i >= arr.length || j >= arr.length) {
            return;
        }
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 通过异或的手段交换数组中两个位置的值
     * <p>
     * 异或交换说明：如两个数为a和b
     * a = a^b
     * b = a^b = (a^b)^b = a
     * a = a^b = (a^b)^a = b
     * </p>
     *
     * @param arr 源数组
     * @param i   位置1
     * @param j   位置2
     */
    public static void swapByXOR(int[] arr, int i, int j) {
        if (i == j)
            return;
        if (i < 0 || j < 0 || i >= arr.length || j >= arr.length) {
            return;
        }
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }


}
